package ca.etsmtl.log430.lab2.tests;

import ca.etsmtl.log430.common.Displays;
import ca.etsmtl.log430.common.Project;
import ca.etsmtl.log430.common.ProjectReader;
import ca.etsmtl.log430.common.Resource;
import ca.etsmtl.log430.common.ResourceChecker;
import ca.etsmtl.log430.common.ResourceReader;
import ca.etsmtl.log430.common.Termio;



/**Tests for the ResourceAssignment Application. Two data files are necessary at the root of the project:
 
FILE resources.txt:
R001 Bleau Joseph ANA P001 P003 
R002 Diant Letu DES P002 P003
R003 Smith John PRG P004
R004 Lebogue Itrouve TST P001
R005 Blo Joe PRG P004

FILE projects.txt
P001 Projet1 2012-12-20 2013-05-18 H
P002 Projet2 2013-05-19 2013-07-22 M
P003 Projet3 2013-09-01 2014-04-01 L
P004 Projet4 2013-10-01 2014-03-01 L
P005 Projet5 2012-12-18 2012-12-22 L
P006 Projet6 2013-10-15 2013-10-16 H
P007 Projet7 2013-10-16 2013-10-17 M
 **/
public class RessourceAssignmentTests {

	public static void main(String[] argv){
		
		//init all the stuff like in ResourceAssignment
		Project project = null; // A project object
		Resource resource = null; // A resource object
		Termio terminal = new Termio();

		// Instantiates a display object
		Displays display = new Displays();
		
		ProjectReader projectList = new ProjectReader("projects.txt");
		ResourceReader resourceList = new ResourceReader("resources.txt");

		if ((projectList.getListOfProjects() == null)
				|| (resourceList.getListOfResources() == null)) {
			System.out
					.println("\n\n *** The projects list and/or the resources"
							+ " list was not initialized ***");
		}
		
		
		
		//MODIF 1: Ajoutez une option qui permet d'afficher la liste des projets auxquels une ressource était 
		//déjà affectée avant l'exécution courante du système. 
		
		/* 1.1
		 * On affiche ici les projets associés à la ressource R001, c’est-à-dire 
		 * les projets P001 et P003. Le test devrait réussir.
		 */
		
		System.out.println("Modif 1. Test 1.1. Answer should be P001 and P003");
		resource = resourceList.getListOfResources().findResourceByID("R001");
		if (resource != null) {
			display.displayProjectsPreviouslyAssignedToResource(resource,
					projectList.getListOfProjects());
		} // if
		
		
		System.out.print("\n*** Press Enter To Continue ***");
		terminal.keyboardReadChar();
		
		//MODIF 2: Ajoutez une option qui permet d'afficher tous les rôles ayant été assignés à un projet 
		//spécifique, incluant les rôles assignés avant l'exécution courante et les rôles assignés durant l'exécution 
		//courante.
		
		/* 2.1
		 * On affiche ici les rôles associés au projet P003, c’est-à-dire ANA et DES. Le test devrait réussir.
		 */

		System.out.println();
		System.out.println("Modif 2. Test 2.1 Answer should be ANA, DES");
		project = projectList.getListOfProjects().findProjectByID("P003");

		if (project != null) {
			display.displayRolesAlltimeAssignedToProject(project, resourceList.getListOfResources());
		} // if
		
		
		System.out.print("\n*** Press Enter To Continue ***");
		terminal.keyboardReadChar();
		
		
		/* 2.2
		 * On ajoute le projet P003 à la ressource R003, qui a le rôle PRG. On affiche ensuite de 
		 * nouveau les rôles du projet P003, qui devrait maintenant inclure PRG en plus de 
		 * ANA et DES. Le test devrait réussir.
		 */
		
		//assign a resource and check if output is updated
		
		assign(resourceList.getListOfResources().findResourceByID("R003"), 
				projectList.getListOfProjects().findProjectByID("P003"),
				resourceList, projectList);
		
		System.out.println("Assigned a project (P003) to a PRG ressource");
		System.out.print("\n*** Press Enter To Continue ***");
		terminal.keyboardReadChar();
		
		System.out.println();
		System.out.println("Modif 2. Test 2.2 Answer should be ANA, DES, PRG");
		
		if (project != null) {
			display.displayRolesAlltimeAssignedToProject(project, resourceList.getListOfResources());
		} // if
		
		
		System.out.print("\n*** Press Enter To Continue ***");
		terminal.keyboardReadChar();
		
		//MODIF 3: Modifiez le système existant de telle sorte qu'une erreur soit signalée lorsqu'une 
		//ressource est surchargée
		
		/* 3.1
		 * R001 contient P001 et P003. On ajoute P002. Le test devrait réussir car le projet de 
		 * priorité H ne se déroule pas en même temps que le projet de priorité M, et les 2 
		 * projets qui se superposent (P002 et P003) n’ont pas des priorités élevées.
		 */
		
		System.out.println("Modif 3. Test 3.1. Adding 3 NOT overlapping projects (P001, P002 and P003) "
				+ "Result should be success");
		
		assign(resourceList.getListOfResources().findResourceByID("R001"), 
				projectList.getListOfProjects().findProjectByID("P002"),
				resourceList, projectList);
		
		System.out.print("\n*** Press Enter To Continue ***");
		terminal.keyboardReadChar();
		
		/* 3.2
		 * R003 contient P004. On ajoute P003. Le test devrait réussir car on 
		 * superpose seulement deux projets ayant une priorité L (charge de 2x25%).
		 * 
		 */

		System.out.println("Modif 3. Test 3.2. Adding two overlapping low priority projects (P003 and P004)."
				+ " Result should be success");
		
		assign(resourceList.getListOfResources().findResourceByID("R005"), 
				projectList.getListOfProjects().findProjectByID("P003"),
				resourceList, projectList);
		
		System.out.print("\n*** Press Enter To Continue ***");
		terminal.keyboardReadChar();
		
		/* 3.3
		 * R005 contient P003 et P004. On ajoute P006. Le test devrait échouer car on a une 
		 * surcharge de la ressource durant toute la durée du P006 (2013-10-15 au 2013-10-16). 
		 * La surcharge est de 25%+25%+100% = 150% et les projets en jeu sont Projet3, Projet4 et Projet6.
		 */
		
		System.out.println("Modif 3. Test 3.3. Two L(P004 and P003) and one H(P006) overlaping projects. "
				+ "Result should be failure with error (150%) on day 2013-10-15 and 2013-10-16");
		
		assign(resourceList.getListOfResources().findResourceByID("R005"), 
				projectList.getListOfProjects().findProjectByID("P006"),
				resourceList, projectList);
		
		System.out.print("\n*** Press Enter To Continue ***");
		terminal.keyboardReadChar();
		
		/* 3.4
		 * R004 contient P001. On ajoute P005. Le test devrait échouer car on a une surcharge
		 *  de la ressource durant les jours où les 2 projets se déroulent (2012-12-20 au 2012-12-22). 
		 *  La surcharge est de 100%+25% = 125% et les projets en jeu sont Projet1 et Projet5.
		 */
		System.out.println("Modif 3. Test 3.4. One H(P001) and one L(P005) overlaping projects. "
				+ "Result should be failure with error (125%) on days 2012-12-20 to 2012-12-22");
		
		assign(resourceList.getListOfResources().findResourceByID("R004"), 
				projectList.getListOfProjects().findProjectByID("P005"),
				resourceList, projectList);
	
		System.out.println();
		System.out.println("TESTS DONE");
		
	}

	private static void assign(Resource resource, Project project, 
			ResourceReader resourceList, ProjectReader projectList){
		
		ResourceChecker checker = new ResourceChecker();
		if(checker.validate(resource, projectList.getListOfProjects(), project)){
			project.assignResource(resource);
			resource.assignProject(project);
			System.out.println("Project assigned to resource.");
		}else
			System.out.println("Unable to assign project");
	}
}
